group by
contents
다음은 GROUP BY 와, GROUP BY 내에서 MAX 함수와 CASE 문이 어떻게 함께 작동하는지에 대한 설명입니다.
1. 기초: GROUP BY란 무엇인가?
SQL에서 GROUP BY는 동일한 데이터를 가진 행(Row)들을 하나의 그룹으로 묶어주는 역할을 합니다.
GROUP BY없을 때: 데이터베이스는 전체 테이블을 하나의 거대한 리스트로 취급합니다.GROUP BY있을 때: 데이터베이스는 마치 카드 정리 기계처럼 작동합니다. 지정한 컬럼을 기준으로 행들을 여러 개의 "양동이(Bucket)"나 "무더기"로 분류합니다.
시각적 비유:
M&M 초콜릿 봉지가 있다고 상상해 보세요.
- 일반 쿼리: "M&M 개수 세어봐." -> 결과: 100개.
GROUP BY 색상: "색깔별로 무더기를 나눈 다음, 각 무더기의 개수를 세어봐." -> 결과: 빨강(20), 파랑(30), 초록(50).
2. GROUP BY와 MAX() (기본 사용법)
GROUP BY와 함께 MAX() 같은 집계 함수를 쓰면, 함수는 각 그룹마다 새로 시작됩니다.
상황: Salaries(급여) 테이블이 있습니다.
부서 | 직원 | 급여
--------|----------|-------
IT | 철수 | 100
IT | 영희 | 120 <-- IT 부서의 최대값
인사 | 민수 | 90
인사 | 수진 | 95 <-- 인사 부서의 최대값
쿼리:
SELECT 부서, MAX(급여)
FROM Salaries
GROUP BY 부서;
결과:
- IT: 120
- 인사: 95
3. 심화: MAX 내부의 CASE 문
이것이 가장 흥미로운 부분입니다. 이 기술은 주로 피벗(Pivot), 즉 행(Row)을 열(Column)로 바꿀 때 사용됩니다. 이를 "조건부 집계(Conditional Aggregation)"라고 합니다.
논리적 흐름 (Logic Flow)
MAX(CASE WHEN ... END)를 작성하면, 데이터베이스는 각 그룹에 대해 두 단계의 작업을 수행합니다.
- 1단계 (CASE 문): 그룹 내의 모든 행을 세로로 훑어내려갑니다. 조건에 맞는 값은 그대로 유지하고, 맞지 않는 값은
NULL로 바꿔버립니다. - 2단계 (MAX 함수): 1단계의 결과를 봅니다. 집계 함수는
NULL을 무시하기 때문에, 필터링을 통과하고 살아남은 값 중 가장 큰 값을 선택합니다.
상세 예시: "학생 성적표" 문제
TestResults 테이블:
| 학생 | 과목 | 점수 |
|---|---|---|
| 철수 | 수학 | 90 |
| 철수 | 과학 | 85 |
| 영희 | 수학 | 95 |
| 영희 | 과학 | 80 |
우리는 학생당 한 줄만 나오게 하고, 수학과 과학을 별도의 열(Column)로 만들고 싶습니다.
쿼리:
SELECT
Student,
MAX(CASE WHEN Subject = 'Math' THEN Score ELSE NULL END) AS Math_Score,
MAX(CASE WHEN Subject = 'Science' THEN Score ELSE NULL END) AS Science_Score
FROM TestResults
GROUP BY Student;
엔진 내부 실행 과정 (슬로우 모션)
'철수' 그룹을 처리하는 과정을 봅시다:
단계 A: 수학(Math)을 위한 CASE 처리
- 1번 행 (수학: 90): '수학' == '수학'? YES. 결과 = 90.
- 2번 행 (과학: 85): '과학' == '수학'? NO. 결과 = NULL.
- 수학 중간 리스트:
[90, NULL]
단계 B: 수학을 위한 MAX 처리
MAX(90, NULL)-> 90. (NULL은 무시됨)
단계 C: 과학(Science)을 위한 CASE 처리
- 1번 행 (수학: 90): '수학' == '과학'? NO. 결과 = NULL.
- 2번 행 (과학: 85): '과학' == '과학'? YES. 결과 = 85.
- 과학 중간 리스트:
[NULL, 85]
단계 D: 과학을 위한 MAX 처리
MAX(NULL, 85)-> 85.
최종 결과:
| 학생 | Math_Score | Science_Score |
|---|---|---|
| 철수 | 90 | 85 |
| 영희 | 95 | 80 |
4. 왜 SUM 대신 MAX를 쓰나요?
이 패턴에서 MAX와 SUM이 혼용되는 것을 자주 볼 수 있습니다.
MAX사용: 해당 조건에 맞는 값이 그룹당 하나만 있을 때 사용합니다 (예: 한 학생의 수학 점수는 하나뿐). 하나뿐인 값 중 최대값은 그 값 자체니까요.SUM사용: 만약 학생이 수학 시험을 3번 봤고, 그 총점을 원한다면SUM을 씁니다.
값이 하나뿐인 경우 MAX(90)은 90이고, SUM(90)도 90이므로 결과는 동일합니다. 하지만 의미적으로 "값 추출"에는 MAX가 더 자주 쓰입니다.
references